約 4,455,830 件
https://w.atwiki.jp/sawa2/pages/14.html
Rails Railsの習慣とかフレームワークは秀逸。 それに従うだけで自然に整理整頓されたコード群ができあがるというところがとても魅力的。 大きなアプリケーションを作るのに向いているということなのかな。 大きくなれるからTwitterのように落ちたりすると「やっぱりRailsは早熟」といわれちゃったりする。 RDocはhttp //railsapi.com/doc/rails-v2.3.8/ここのがおすすめです。 app アプリケーションとしての機能を記述する。Railsの表舞台。 controllers helpers models views config 設定ファイル群ですね。gemをロードしたり、I18n(国際化)のための定義ファイルがあったり。 db データベースに関する記述をする。テーブルは把握しやすい構造にしておきたい。ここでは、結構地味な作業が必要なんですね。 public images javascripts stylesheets script サーバー、コンソール、ジェネレーター、、、Railsアプリケーションに魂を宿すスクリプトがこの中に。 vendor 主に他の人たち(vendorってことなんじゃないかな)が作ったコード/プラグインを置いておきます。 バージョン Rails 2.3.5, Rails 2.3.6, Rails 2.3.7, Rails 2.3.8
https://w.atwiki.jp/sawa2/pages/46.html
Rails Rails 2.3.6 http //weblog.rubyonrails.org/2010/5/23/ruby-on-rails-2-3-6-released のてきとーな翻訳です。 Ruby on Rails 2.3.6リリース Jeremy Kemperにより2010/05/23に投稿されたものです。 私たちはRuby on Rails 2.3.6をリリースしましたよ。その内容は、6ヶ月に及ぶバグフィックス、いくつかの新しい特徴、Rails 3への大きな架け橋となります。 Rails 2.3.6に含まれる古くて使われない特徴をdeprecated(将来消される機能)にしました。なので、Rails 3では、それらが完全に消される可能性があります。もし、Rails 2.3.6上でのアプリケーションがdeprecation warning無しで動くのであれば、上手く移行できるでしょう。 このじっくりと作られた料理が有志による87人によりもたらされてます。 では、ごちそうをいただきましょう。 Action Pack Rackを1.0.1から1.1.0へアップデート XSS(クロスサイトスクリプティング)対策 Rails 3に合わせ(?) http //github.com/rails/rails_xss のものを公式プラグインとした クッキー convenient cookie jar add-ons to set permanent or signed cookies, or both at once cookies.permanent.signed[ remember_me] = current_user.id. さらに読む Flash もっとも一般的なキーであるalertとかnoticeとかをもっと使えるようにした。 self.alert = ... self.notice = ... とかが使える。 redirect_to url, alert = ... redirect_to url, notice = ... も加えた。さらに読む i18n(国際化) labelヘルパをローカルに(?) Active Record 名前空間(Namespacing) support optional table name prefixes on modules by defining self.table_name_prefix. さらに読む Destroy uses optimistic locking. Counter cache use Post.reset_counters(1234, comments) to count the number of comments for post 1234 and reset its comments_count cache. PostgreSQL サポートしていれば、常にstandard-conforming stringsを使う。 MySQL add indexにlengthのオプションをつけることができるようになった。。さらに読む MySQL add_columnとchange_columnに first = trueと after = other_columnの引数をつけることで、コラムの位置を変更できる。 Active Support i18nを1.3.3から1.3.7にアップグレード。 TZInfoを0.3.12から0.3.16へアップグレード。 マルチバイト speed up string verification and cleaning. JSON 可能であれば、JSONデコードのためにYAJLを使おう。 gem install yajl-ruby Testing add assert_blank and assert_present. Read more Core backport Object#singleton_class from Ruby 1.8.8, deprecating our Object#metaclass. Core add Object#presence that returns the object if it’s #present? otherwise returns nil. Example region = params[ state].presence || params[ country].presence || US Core add Enumerable#exclude? to match include?. Core rename Array#rand to Array#random_element to avoid collision with Kernel#rand. Core rename Date# and Time#last_(month|year) to #prev_(month|year) for Ruby 1.9 forward compatibility. Active Resource JSON ActiveResource Base.include_root_in_json = true とすると、to serialize as a hash of model name - attributes instead of a bare attributes hash。デフォルトはfalseです。 Action Mailer TMailを1.2.3から1.2.7にアップグレード。 Railties RubyGems 1.3.6 deprecation warningを出さない。 詳しくは、コミットログを読んでください。
https://w.atwiki.jp/kurails/pages/15.html
[Rails3.0+] プロジェクトの作成 プロジェクト作成したいディレクトリまでcdコマンドを使って移動する ※プロジェクト名には複数形とか,プログラム言語の予約語とかは使わない方がいい rails new (プロジェクト名) ※今後,下記の通り読み替えて下さい. RAILS_ROOT - プロジェクトを作ったディレクトリです.appやconfigがあるところ データベース,MVCの作成 rails g scaffold (作りたいテーブルの名前を全部小文字・単数形) (挿入したいカラムの名前と型) 例 rails g scaffold user user_name string age integer user_note text Rails3.0+では,1.2と違い,scaffoldがテーブル生成のマイグレーションファイルやMVCを全部作ってくれます. 実際にデータベースに反映する rake db migrate サーバ起動 RAILS_ROOTで, rails s http //localhost 3000にアクセス ちゃんとみれたら http //localhost 3000/(データベースの名前を全部小文字・複数形で)
https://w.atwiki.jp/maimuzo/pages/49.html
プラグイン名 active_formプラグイン このプラグインができること 実テーブルがなくても(ActiveRecordを継承して無くても)バリデーターが使える ちょっとしたものを入力したいときなどに便利 ちょー簡単な使い方 ruby script/plugin install http //www.realityforge.org/svn/code/active-form/trunk/ mv vendor/plugins/trunk vendor/plugins/active_form でインストールして、 require active_form class MultiMessage ActiveForm attr_accessor addresses, body, title #←ここで扱う属性を定義 validates_presence_of addresses, body, title end だけ。あとは普通のARインスタンスと同じ。 公式ページ どこなんだろうね? 日本語解説ページ RailsのActiveFormの使い方 | 京の路 外国語解説ページ あるかもしれないけど、必要なくね? コメント 名前
https://w.atwiki.jp/kurails/pages/10.html
用意するもの Ruby 1.8 Rails1.2.3 MySQL5.0.27 [Rails1.2] プロジェクトの作成 プロジェクト作成したいディレクトリまでcdコマンドを使って移動する ※プロジェクト名には複数形とか,プログラム言語の予約語とかは使わない方がいい rails (プロジェクト名) ※今後,下記の通り読み替えて下さい. RAILS_ROOT - プロジェクトを作ったディレクトリです.appやconfigがあるところ データベースの作成 RAILS_ROOT/config/database.ymlの, 「develpment 」以下の項目を参照 database XXXXXXXXX_develpment コマンドプロンプトを開いて, mysql -u (ユーザ名) -p パスワードを打ち込む mysql create database XXXXXXXXX_develpment; mysql quit モデルの作成 テーブルの名前と,カラムの名前,型を指定します. ruby script/generate model (作りたいテーブルの名前を全部小文字・単数形) (挿入したいカラムの名前と型) 例 ruby script/generate model user user_name string age integer user_note text 実際にデータベースに反映する rake db migrate Railsに入出力のインタフェース(とロジック)を作ってもらう cd (プロジェクト名) ruby script\generate scaffold (作りたいテーブルの名前を先頭大文字・単数形で) 例 ruby script\generate scaffold User RAILS_ROOT/app/controllersに [Rails1.2] (テーブル名)s_controller.rb があるか確認 RAILS_ROOTで, ruby script/server http //localhost 3000にアクセス ちゃんとみれたら http //localhost 3000/(データベースの名前を全部小文字・複数形で)
https://w.atwiki.jp/summer2010/
How you can sign up for a visit If you are interested in visiting us during the camp, you must complete this form online. We will accommodate up to two families a day (2 persons / family). The slots are given to families on a first-come-first-served basis. You may sign up for only one slot. When you can sign up for a visit Please note that the slots are allocated either in the morning and/or in the afternoon of each day depending on the class offering. Please refer to the program schedule that was included in the Orientation Leaflet to learn more about the class schedule. Remarks Please arrive at the camp site five minutes before the time you signed up for. Kindly note that meals will not be provided for visitors. TIMETABLE WEEK 1 (July 19 – July 24) July 19 Mon July 20 Mon July 21 Sun July 22 Mon July 23 Mon July 24 Mon 8 45-11 30 unoccupied unoccupied unoccupied unoccupied unoccupied unoccupied unoccupied unoccupied unoccupied unoccupied 13 00-17 00 unoccupied unoccupied unoccupied unoccupied WEEK 2 (July 25 – July 30) July 25 Sun July 26 Mon July 27 Mon July 28 Sun July 29 Mon July 30 Mon 8 45-11 30 unoccupied unoccupied unoccupied unoccupied unoccupied unoccupied unoccupied unoccupied 13 00-17 00 unoccupied unoccupied unoccupied unoccupied unoccupied unoccupied unoccupied unoccupied Entry Form 名前 :Name of student (e.g. George W. Bush) コメント:Name, Time for your visit (e.g. George H. W. Bush, Barbara P. Bush, July 26 Mon 8 45-11 30) [投稿]:[Submit] test -- (Lin Kobayashi) 2010-06-03 14 06 16 test 2 -- (Lin Kobayashi) 2010-06-03 14 06 34 July 25 13 00-17 00 -- (Lin Kobayashi) 2010-06-03 14 06 57 名前 コメント すべてのコメントを見る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
https://w.atwiki.jp/sawa2/pages/47.html
Rails Rails 2.3.7 http //weblog.rubyonrails.org/2010/5/24/ruby-on-rails-2-3-7-released をてきとーに翻訳しました。 Ruby on Rails 2.3.7リリース Jeremy Kemperにより2010/05/24投稿されたものです。 2.3.6 releaseが出て間もないが, Nathan WeizenbaumがHAMLで、Rails 2.3.6をサポートするようにした。彼は、Rails 3から移植されたHTML-safety機能にいくつかのバグがあることを発見したので、私たちはRails 2.3.7にて修正を加えた。 もし、rails_xssプラグインによって自動でHTMLエスケープを使っているならば、Rails 2.3.7と最新のrails_xssにアップグレードすべきである。 もし、rails_xssプラグインをまだ使ったことがないのであれば、今始めてみよう。rails_xssはRails 3に組み込まれるので。 追伸 rails_xssプラグインとの互換性を修正したら、rails_xssを使わないアプリケーションのHTML-safety機能が壊れてしまった。大変申し訳なく思う。HTML-safety is meant to be opt-in! この修正は2.3.8.pre1にて利用可能で、リリースは短い予定である。
https://w.atwiki.jp/hide1227/pages/16.html
【参考文献】:AJAX HACKS 6章 Hacks45-52(p207~) MVCアーキテクチャ MVCとはデザインパターンの一種で、アプリケーションの構成を、Model、View、Controllerというコンポーネントに分けて設計する手法を言う。 Ruby On Rails のインストール 編集中。。。あまりここに時間を割きたくないな。ぼそ ここでは、InstantRails-1.7-win.zipを導入して使います。 Rails アプリの作成 1.開発環境 始める前に、念のため開発に使用するマシンのスペックを調べておきます。 Windows XP SP2 であれば、まあ問題ないでしょう。今回はWindows2000でやってみます。 ちなみに、マシンスペックの調べ方は、コマンドで「dxdiag」 C \InstantRails\rails_apps dxdiag 今回の開発環境のサンプル) ------------------ System Information ------------------ Time of this report 10/16/2008, 09 52 20 Machine name HIDE2000 Operating System Windows 2000 Professional (5.0, Build 2195) Service Pack 4 Language Japanese (Regional Setting Japanese) System Manufacturer VMware, Inc. System Model VMware Virtual Platform BIOS Default System BIOS Processor Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz, ~2.4GHz Memory 724MB RAM Page File 408MB used, 1049MB available Windows Dir C \WINNT DirectX Version DirectX 9.0c (4.09.0000.0904) DX Setup Parameters Not found DxDiag Version 5.03.0001.0904 32bit Unicode 【補足:開発支援の為のIDE Tool】 開発支援の為のIDEToolとして、eclipseかAptanaかNetBeansなどを利用すると便利だと思います。 今回は「eclipse」に「Aptana」プラグイン、「RadRails」プラグインを仕込んで使います。(※) ※)手っ取り早く環境を構築するには? これらが全部そろった「pleiades-all-in-one-ultimate_20081006.zip」がお勧めです。(=>ダウンロードはこちらから。Eclipse 3.4.1 Ganymedeのultimateがお勧めです。ちなみに3.3.1のほうにはultimateでも今回使いたいRadRailsのプラグインが入ってませんでした。。。) ※) eclipse 3.2.1 に RadRailsプラグインを追加する方法 AptanaプラグインとRailsプラグインのインストール Eclipseを起動し、「ヘルプ」→「ソフトウェアの更新」→「検索してインストール」を選びます。 ダイアログボックスが出たら「新規フィーチャーを探す」を選びます。 アップデートサイト選択画面で「新規リモート」を選びます。 ここでは次の2つのサイトを登録します。 ・http //update.aptana.com/install/3.2/ ・http //update.aptana.com/install/rails/3.2/ 1つ目がAptana本体、2つ目がAptanaのRailsプラグインになります。 リモートサイトを2つ登録し終わったら、「次へ」をクリックし、 以降は通常の更新機能と同様に操作して、インストールを行います。 Railsパースペクティブを開く プラグインのインストールが終わり、Eclipseを再起動したら、 Railsパースペクティブを開きます。 「ウィンドウ」→「パースペクティブを開く」→「その他」の中に 「Rails」というパースペクティブがあるので、これを選択します。 ここを参考にしました。http //blog.codezine.jp/editor/2007/06/aptana_eclipseruby_on_rails_1.phpちなみに、3.3.x だとうまくいきません。3.3用のURLもどこかにあると思いますが、 それは調べていません。 2.Railsのヴァージョン Railsの開発の場合、特にヴァージョンの組み合わせは重要です。 今回は、InstantRails-1.7-win.zipをインストールして準備した環境なので、「Rails 1.2.3」になります。このヴァージョンが現在最も情報量が豊富です。(=>ダウンロードはこちらから。) ※ rubyの最新の1.9などは1.8.6に比べてだいぶ変わったようですし、フレームワークであるrailsもヴァージョンが1.2.X系と2.X系ではscaffoldなどかなりやり方が異なります。パッケージ管理Toolであるgemなども実はgem自体のヴァージョンによりインポートできるモジュールのヴァージョンが違ったりと、手抜かりがあるとなかなか手こずりますので注意しましょう。 C \InstantRails\rails_apps ruby -vruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32] C \InstantRails\rails_apps gem envRubyGems Environment - VERSION 0.9.2 (0.9.2) - INSTALLATION DIRECTORY C /InstantRails/ruby/lib/ruby/gems/1.8 - GEM PATH - C /InstantRails/ruby/lib/ruby/gems/1.8 - REMOTE SOURCES -http //gems.rubyforge.org C \InstantRails\rails_apps rake --version rake, version 0.7.2 C \InstantRails\rails_apps rails --version Rails 1.2.3 C \InstantRails\rails_apps mysql --version mysql Ver 14.12 Distrib 5.0.27, for Win32 (ia32) ・ もうひとつのヴァージョンの調べ方 ひとつひとつのコマンドを打ち込んでヴァージョンを調べてもいいけれども、Railsの場合たくさんのパッケージやモジュールで構成されていて調べるのはいささか面倒です。そこで一発でこれらを調べるコマンドを紹介します。ただし、これはプロジェクト内部のaboutコマンドなので、少なくとも後述するプロジェクトを何かひとつ作成してから、実行してください。 // これはうまくいきません。 C \InstantRails\rails_apps ruby script/about C \InstantRails\rails_apps\hacks ruby script/aboutAbout your application s environmentRuby version 1.8.6 (i386-mswin32) RubyGems version 0.9.2 Rails version 1.2.3 Active Record version 1.15.3 Action Pack version 1.13.3 Action Web Service version 1.2.3 Action Mailer version 1.3.3 Active Support version 1.4.2 Application root C /InstantRails/rails_apps/hacks Environment development Database adapter mysql 3.作成手順 RailsアプリはDB利用を前提としたWebアプリになるため、Railsの命名規則が重要になってきます。ここら辺はDRYやCoCの思想によるところですが、今回のAjax用のRailsアプリサンプルとして以下の情報をまず収集します。 プロジェクト名:プロジェクトのルートとなる名前、主にフォルダ管理のため。 使用するRDB:MySQL,SQLite3,PostgreSQL,SQL Server,DB2,Oracle DB名:開発用、テスト用、リリース用の三種類を用意します。 テーブル名:複数形小文字英数字 モデル名:原則としてテーブル名と関連します。単数形のテーブル名 それでは、今回のAjax用のRailsアプリサンプルの情報を定義していきましょう。 プロジェクト名:hacks 使用するRDB:mysql DB名:hacks_development,hacks_test,hacks_production テーブル名:kilowatts モデル名:Kilowatt ここで、一応テーブルの定義も決めておきましょうか。 Kilowattsテーブル定義 NO カラム名 型 NotNull 主キー 1 id int true true 2 kdate text 3 kwatts int DDLファイルを作成するとしたら、以下のようになるかと思います。(※) DDL kilowatts.sql DROP TABLE IF EXISTS kilowatts; CREATE TABLE kilowatts ( id MEDIUMINT NOT NULL AUTO_INCREMENT, kdate TEXT, kwatts INT, PRIMARY KEY(id) ); ※)ただし、Railsの作成方法では、このようなDB周りの準備もRailsでサポートされており、具体的には「マイグレーション」という手法を使います。ちなみに、この作成方法はRails 1.2.x 系列とRails 2.x 系列で作成手順が違います。これは追って説明します。 【参考】:ソースダウンロード ちなみに、このページはUTF8になります。ブラウザで文字化けなどしたらエンコードを変更してみてください。AjaxHacksSamples.zipを解凍してサンプルコードを手に入れてください。 【事前準備】 InstantRailsでインストールした場合は、InstantRails.exe は起動しておきましょう。起動するとApacheとMySQlが立ち上がります。後ほどRailsからDBを作成したり、テーブルを作成しますが、そのためには今回使用するMySQLがサービスとして起動している必要があります。Webサーバは開発モードでは他の(Mongrelサーバ)を使うのでApacheは立ち上げる必要性はないですが、DBの確認作業で、phpMyAdminというToolを使う場合はApacheサーバを立ち上げておく必要があります。 また、DBにMySQLを使用するのであれば、最初に、my.iniファイルにてDBの文字コード指定をしておきます。以下のソースの青字部分を追記してください。 C \InstantRails\mysql\my.ini ; ---------------------- IMPORTANT ---------------------------; ; ${path} is used to specify Instant Rails installation path. ; ;-------------------------------------------------------------; [mysqld] datadir=${path}/mysql/data basedir=${path}/mysql bind-address=127.0.0.1 ; Uncomment for use on USB key ; skip-innodbdefault-character-set=utf8 skip-character-set-client-handshake ここまで準備すれば、雛形部分の作成は15分もかからないでしょう。 【プロジェクトの作成】 // 1.0 railsアプリのルートフォルダに移動 // InstantRailsでインストールした場合には、その下に「rails_apps」があるはず。そこです。C \ cd C \InstantRails\rails_apps // 2.0 railsコマンドの実行 // 通常は、Rails 1.2.3 の場合、DBは mysql になります。 // rails hacks // // デフォルトじゃないDBシステムを指定するには // rails hacks -d mysql // かもしくは、 // rails hacks --database=mysql //C \InstantRails\rails_apps rails hacks -d mysql 【DB作成】 DBの作成の仕方には幾通りかあります。各ベンダーにより簡単なやりかたがそれぞれあるでしょうが、RailsにはrakeコマンドでDB作成Toolを作成することもできます。それを使用すればマルチDBの作成が夢ではないと思いますが、それは次回のテーマに譲ることにして、ここでは、使用するDBをMySQLとした場合、InstantRails導入した際に利用できるphpMyAdminを使用して簡単に作成してしまいましょう。InstantRails.exeが立ち上がっている状態であれば、以下のURLにアクセスできるはずです。 http //127.0.0.1/mysql/ 今回作成するDBは三種類です。 hacks_development hacks_test hacks_production これは先ほどのプロジェクトの作成の際に自動で命名規約されているDB名です。もちろんこれを変更することも可能ですが、それは以下のリソースに定義してあります。まず素直に自動生成されたソースを覗いてみましょう。 C \InstantRails\rails_apps\hacks\config\database.yml development adapter mysql database hacks_development username root password host localhost test adapter mysql database hacks_test username root password host localhost production adapter mysql database hacks_production username root password host localhost 今回はここでデフォルトに指定されているDB名をそのまま使用することにします。DB名を変えたければ、[database ]の値を変えればいいでしょう。 ちなみに、今回はMySQLなのでこのまま使用しますが、Oracleなどの場合は、DBを複数作成するよりも、スキーマを3つ用意したほうが現実的だと思われます。 【補足:文字コード問題】 my.iniに指定したように、このdatabase.ymlファイルでも文字コードを指定します。3つのDB定義の最後の要素にそれぞれ以下を追加します。(※MySQL使用時には必要ですがOracle使用する場合は必要がないようです。) encoding utf8 また、文字コード問題というと、DBの文字コードだけでなく、Ruby自体の文字コード指定をする必要があります。 今回のRailsアプリの文字コード指定は、「environment.rb」というファイルでの最初の行で設定します。 例)文字コードをUTF-8に指定するやりかた。 $KCODE = "UTF8" もしくは、 $KCODE = u どちらも同じ意味です。最初の 1 バイトしか読み取っていないようです。しかも大文字小文字すら関係ないようです。でも自分としては可読性を考慮してUTF8と記述したいところです。 【参考サイト】http //www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFCAD1BFF4.html では、phpMyAdminのサイトにてこれらの3つのDBを作成してみましょう。 確認は、phpMyAdminでもできますが、コンソールからDBが作成されたことを確認してみます。 C \InstantRails\rails_apps\hacks mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 18 to server version 5.0.27-community Type help; or \h for help. Type \c to clear the buffer. mysql show databases; +----------------------------------------+ | Database | +----------------------------------------+ | information_schema | |hacks_development | |hacks_production | |hacks_test | +----------------------------------------+ 29 rows in set (0.01 sec) mysql 【eclipse へインポート】 この辺で、今後の作業の円滑を図り、eclipseへプロジェクトごとインポートしておきます。 プロジェクトを選択 選択してOK押下 作成されたことを確認 プロジェクトをマウントしたら、すかさずeclipseプロジェクト上の文字コードをUTF8に設定する。 【テーブルの作成】事前準備してあるテーブル定義書に従い、Rails用のDDLファイルといえるマイグレーションファイルを作成します。 作成の手順は、Rails 1.2.3 と Rails 2.0.2 では微妙に異なります。Rails 1.2.3では、 ジェネレータの「migration」サブコマンドにてマイグレーションファイルのスタブを作成して後 テーブル定義書に従い、マイグレーションファイルの編集 「db migrate」コマンドを実行する。 その後、「scaffold」を実行し、テーブルに対応するモデルクラスやコントロールクラスのCRUD構成を一気に作成する。 という手順になるが、Rails 2.0.2では 「scaffold」にて、MVCアーキテクチャのすべてのソースを一気に作成する。 「db migrate」コマンドを実行する。 ただし、その際の「scaffold」のコマンドオプションの指定の仕方が変わりました。カラム名や型を同時に宣言しなければならなくなりました。 ここでは、Railsのヴァージョンは 1.2.3 なので、最初の手続きによるやり方で行う。 ちなみに、eclipse の RadRailsパースペクティブにおいては、generatorというviewが存在し、 そこでコマンドを実行が可能です。 ここでは、コマンドラインでの実行方法を紹介します。(Rails 1.2.3の場合) C \InstantRails\rails_apps\hacks ruby script/generate migration create_kilowatts create db/migrate create db/migrate/001_create_kilowatts.rb C \InstantRails\rails_apps\hacks ちなみに、Rails 2.0.2の場合は migrationではなく、ここでいきなりscaffold していいです。 C \InstantRails\rails_apps\hacks ruby script/generate scaffold kilowatt kdate text kwatts integer では、eclipse に戻って、作業領域をリフレッシュ(F5)した後、編集してみましょう。 001_create_kilowatts.rb(Rails 1.2.3の場合) class CreateKilowatts ActiveRecord Migration def self.up create_table( kilowatts) do |table| table.column kdate , text table.column kwatts , integer end end def self.down drop_table kilowatts end end 001_create_kilowatts.rb(Rails 2.0.2の場合) class CreateKilowatts ActiveRecord Migration def self.up create_table( kilowatts) do |table| table.text kdate table.integer kwatts end end def self.down drop_table kilowatts end end (※注意) Rails1.2.3とRails2.0.2の表記の違いに注意してください。また2.0.2の場合、自動生成される「table.timestamps」ですが、これはカラムの「create_at」と「update_at」に相当します。 このマイグレーションファイルはマルチDBに対応したRails独自の文法による記載になります。 非常に便利なものだが、まず各ベンダーのRDBの型との対応に注意しなければなりません。 手元には、データ型の対応表が必要になると思われる。 型 説明 MySQL SQL Server Oracle id プライマリキー int(11) int NUMBER(38) string 文字列 varchar(255) varchar(255) VARCHAR(255) text 長い文字列 text text CLOB integer 整数 int(11) int NUMBER(38) float 浮動少数 float real NUMBER decimal 精度の高い小数 decimal(10,0) decimal(18,0) NUMBER(38) datetime 日時 datetime datetime DATE timestamp 日時(より細かい) datetime datetime DATE time 時間 time datetime DATE date 日付 date datetime DATE binary バイナリデータ blob image BLOB boolean Boolean型 tinyint(1) bit NUMBER(1) create_at マジックフィールド datetime datetime DATE update_at マジックフィールド datetime datetime DATE 次に「rake db migrate」コマンドを実行する。(ちなみに eclipse の Rake view からも実行が可能だ。) C \InstantRails\rails_apps\hacks rake db migrate == CreateKilowatts migrating ================================================= -- create_table( kilowatts) - 0.0780s == CreateKilowatts migrated (0.0780s) ======================================== この時、「テーブル schema_info」も同時に作成されていることに着目しておこう。これはマイグレーションにおける履歴管理のためのテーブルで、Railsの管理の下、テーブル定義が仕様変更となっても、すぐに反映させたり、また逆に元に戻すことを可能にした仕組みだ。 この点を踏まえると、Railsを使うならば、マイグレーションなしに勝手にテーブル作成することは好ましくないといえるだろう。 【テーブル作成の確認】 C \InstantRails\rails_apps\hacks mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 30 to server version 5.0.27-community Type help; or \h for help. Type \c to clear the buffer.mysql use hacks_development; Database changedmysql show tables; +-----------------------------+ | Tables_in_hacks_development | +-----------------------------+ | kilowatts | |schema_info | +-----------------------------+ 2 rows in set (0.00 sec) mysql 【足場の作成】 ここで足場となるMVCアーキテクチャに沿ったソースを自動生成します。そのためのコマンドとして、先ほど紹介した「scaffold」というコマンドがあります。 C \InstantRails\rails_apps\hacks ruby script/generate scaffold kilowatt exists app/controllers/ exists app/helpers/ create app/views/kilowatts exists app/views/layouts/ exists test/functional/ dependency model exists app/models/ exists test/unit/ exists test/fixtures/ create app/models/kilowatt.rb create test/unit/kilowatt_test.rb create test/fixtures/kilowatts.yml create app/views/kilowatts/_form.rhtml create app/views/kilowatts/list.rhtml create app/views/kilowatts/show.rhtml create app/views/kilowatts/new.rhtml create app/views/kilowatts/edit.rhtml create app/controllers/kilowatts_controller.rb create test/functional/kilowatts_controller_test.rb create app/helpers/kilowatts_helper.rb create app/views/layouts/kilowatts.rhtml create public/stylesheets/scaffold.css ここまでで雛形が完成したはずです。 【動作確認】 では、早速サーバを起動させてみましょう。WebサーバはRailsでは複数用意されていますが、開発モード時点ではApacheなどは使わないです。(かといって現在あがっているApacheを落とす必要はありません。)簡易サーバとして、Mongrelサーバというものが、ありますので、今回はそれを使用します。 サーバー起動のやり方は、コマンドラインとeclipseでの起動のさせ方とありますが、ポート番号まで比較的簡単に指定できるeclipse起動のやり方を紹介します。 まず、eclipseにて対象となるプロジェクト(今回の場合は「hacks」)を選択して、Runします。 ここでOKを押下すれば、対象のサーバインスタンスが立ち上がるはずなのですが、実際には別のインスタンスが起動してしまうような現象に遭遇しました。ヴァージョンは、3.2.1でも3.4.1でも起こります。なのでその場合は、一旦関係のないサーバインスタンスを停止し、再度Serversヴューにて起動対象のサーバインスタンスを選択して実行してみてください。 以上のように起動すれば、Webアプリが起動されているはずです。 以下のURLをブラウザで指定してみましょう。 (今回はIP指定しますが、普段の開発ではHOSTはlocalhostか127.0.0.1でかまわないでしょう。) // 今回のURLhttp //192.168.1.29 3008/kilowatts/ // 通常はデフォルト指定のままなので以下のURLhttp //localhost 3008/kilowatts/http //127.0.0.1 3008/kilowatts/ ホスト名の次に指定するURIの要素がテーブル名になっていることに着目してください。 また、デフォルトの入り口が、indexになるのですが、実際にはlist画面にリダイレクトされています。ここは、Railsの仕組みをもう少し追いかけていくことで判明します。 とりあえず、ここまでで Railsのアプリの土台部分がが作成できました。 おめでとうございます!! Ajaxライブラリの導入方法 Ajaxには多数のライブラリが存在しており、現在では生で「XMLHttpRequest」オブジェクトを操作することはあまり機会がなくなっているといえるんではないでしょうか。最も有名なライブラリは「Prototype」ですが、これはどうやらRuby On Railsがそのルーツだそうです。ということで Railsをやるならデフォルトでついてきてます。 %= javascript_include_tag defaults% この記述でHTMLソースにはどのように変換されているか調べてみると、 script src="/javascripts/prototype.js?1224125580" type="text/javascript" /script script src="/javascripts/effects.js?1224125580" type="text/javascript" /script script src="/javascripts/dragdrop.js?1224125580" type="text/javascript" /script script src="/javascripts/controls.js?1224125580" type="text/javascript" /script script src="/javascripts/application.js?1224125580" type="text/javascript" /script でした。 自動生成された javascriptライブラリをこの一行でロードしています。一番お手軽な書式ですが、必要なものだけを指定したほうが効率がいいでしょう。その場合は、 %= javascript_include_tag"prototype.js"% ところで、このロードの順番は重要です。前後を入れ替えないこと。 逆に言うと、自分で定義した javascript関数は一番最後にロードされる「application.js」に入れるべきです。 XMLHttpRequestの使い方 XMLHttpRequestの使い方を調べるためにサンプルを作成しましょう。 RailsではXMLHttpRequestを生で使わないとはどういうことでしょうか? ひとつには、ライブラリ「prototype.js」を内部で利用しているため、そのラッパークラスを通じて操作できるためです。 しかし、Railsの場合は、さらにそれをラッピングしたメソッドが存在し、それを利用することができます。 まず、それを確かめるためのコントロールとヴューを作成したいと思います。 ここで、今回はDBを使わないので、あえてscaffoldはせずに、generateではコントローラだけを指定してモデルは作成しないことにします。必要なのはアクションとその画面のみ…ということで、このようなコマンドを実行してみます。 C(コントローラ) hacks V(ヴュー) monitor C \InstantRails\rails_apps\hacks ruby script/generate controller hacks exists app/controllers/ exists app/helpers/ create app/views/hacks exists test/functional/ create app/controllers/hacks_controller.rb create test/functional/hacks_controller_test.rb create app/helpers/hacks_helper.rb コントローラですが、hacks_controller.rb はJavaでいえばサーブレットみたいなものです。URIにも反映されます。V(ヴュー) monitorはまだここでは作成してませんが、アクション名でもあり、コントローラに実装するメソッド名でもあり、Viewとしてのrhtmlファイル名であったりします。この命名規則がしっかりしたところが、Railsが優れた生産性を誇る仕組みでもあります。この恩恵は非常に効率的ですね。MVCに着眼すれば、これからの作業の太枠が決まります。 コントローラのスタブメソッド作成 ヴューの作成 URLの決定 まずアクセス先のURLを決めてしまいます。 http //192.168.1.29 3008/hacks/monitor にすることにして、 コントローラのスタブメソッド作成します。(file ///C /InstantRails/rails_apps/hacks/app/controllers/hacks_controller.rb) class HacksController ApplicationController def index # # URI省略時のインデックスページの処理。特定のアクションにたらい回します。 # monitor render action = monitor end def monitor # # ここに処理を書きます。アクセス時の業務処理です。 # end def tmp # # ここに処理を書きます。まだメソッド名も決めてませんが「送信ボタン」に対応するアクションです。 # end end ヴューの作成 レイアウトをまず決めます。対応するコントローラに対して1本作成します。 file ///C /InstantRails/rails_apps/hacks/app/views/layouts/hacks.rhtml これは、外枠だけの入れ物なので、既存のレイアウトをそのまま複製してしまいます。タイトルくらいはそれらしく編集しておきましょう。 !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http //www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" html xmlns="http //www.w3.org/1999/xhtml" xml lang="en" lang="en" head meta http-equiv="content-type" content="text/html;charset=UTF-8" / %= javascript_include_tag defaults % %= stylesheet_link_tag scaffold % title Ajax呼び出し時の内部状態 %= controller.action_name % /title /head body p style="color green" %= flash[ notice] % /p %= yield % /body /html yieldに入るアクションごとの部品ヴューは file ///C /InstantRails/rails_apps/hacks/app/views/hacks/monitor.rhtml になるでしょう。 内容は、 h1 Monitor /h1 % form_tag action = tmp do % %= render partial = form % %= submit_tag 送信 % % end % な感じにしておきます。送信ボタン押下時のメソッド名をそろそろ決めておかないといけませんが、とりあえず、こうしておきます。 画面自体は出ることをサーバにて確認できます。 では、ここからいよいよメインディッシュにんります。RailsでAjaxを使うには、対応するいくつかのメソッドが用意されています。XMLHttpRequestでは「form_tag」は使用しないのです。その代わりに「form_remote_tag メソッド」を使用します。 form_remote_tag メソッド XMLHttpRequestの機能を活用するためのメソッドです。 基本構造は、 %=form_remote_tag(...param...) % div /div p %= submit_tag 送信 % /p %=end_form_tag% パラメータ部分は多少複雑です。ハッシュ形式の指定方法です。 それぞれのキー項目をみていきます。赤字は必須指定。 update = "" url = {} position = "" success = "" loading = "" loaded = "" interactive = "" failure = "" update = "表示要素のid属性値" なんだけれどもここは結構重要です。肝です。 completeや success指定との違いがわかりづらいのです。ここに参考にできる記事がありますが、もっと調べておく必要性を感じます。 url = { action = リクエストを処理するアクションのシンボル } position = "挿入位置" success = "XMLHttpRequestのreadystateが成功時" ちなみに、readystateがsuccess というのは厳密にはないはずなのだが、指定できるそうだ。completeとほとんど似た状態だが、わずかに successのほうが早い状態になります。 complete = "Element.toggle( id属性値 )" readystate 状態 意味 0 uninitialized 初期化されていない 1 loading 読み込み中 2 loaded 読み込み完了 3 interactive 操作可能 4 complete 準備完了 file ///C /InstantRails/rails_apps/hacks/app/views/hacks/monitor.rhtml %= form_remote_tag ( update = "complete", url = { action = zero_update }, position = "top", success = "$( success ).innerHTML= 成功; ステータスコード= +request.status", loading = "$( loading ).innerHTML= リクエスト送信中…; ステータスコード= +request.status", loaded = "$( loaded ).innerHTML= リクエスト送信完了; ステータスコード= +request.status", interactive = "$( inter ).innerHTML= レスポンス受信中; ステータスコード= +request.status", failure = "$( failure ).innerHTML= エラー; ステータスコード= +request.status") % h3 Ajax呼び出しの内部状態を表示します /h3 div id="loading" style="font-size 1.2em" /div div id="loaded" style="font-size 1.2em" /div div id="inter" style="font-size 1.2em" /div div id="success" style="font-size 1.2em; color green" /div div id="failure" style="font-size 1.2em; color red" /div div id="complete" style="font-size 1.2em; color green" /div p %=submit_tag 送信 % /p %=end_form_tag % file ///C /InstantRails/rails_apps/hacks/app/views/hacks/monitor.rhtml defzero_update # # ここに処理を書きます。まだメソッド名も決めてませんが「送信ボタン」に対応するアクションです。 # render text = "Ajax hello!!!" end render text = "Ajax hello!!!" ここが遷移しない仕組みです。遷移先の画面指定などはしていないのです。この例ではサーバ側の固定文字列を返していますが、コントローラで料理ができるということは、「可変データを非同期に返せる」ということです。静的なサーバ上のデータを返したいだけであるならば、もっと別の手法があります。その手法は別のテーマで触れる予定です。 変換後のHTMLは form action="/hacks/zero_update" method="post"onsubmit="new Ajax.Updater( complete , /hacks/zero_update , {asynchronous true, evalScripts true, insertion Insertion.Top, onFailure function(request){$( failure ).innerHTML= エラー; ステータスコード= +request.status}, onInteractive function(request){$( inter ).innerHTML= レスポンス受信中; ステータスコード= +request.status}, onLoaded function(request){$( loaded ).innerHTML= リクエスト送信完了; ステータスコード= +request.status}, onLoading function(request){$( loading ).innerHTML= リクエスト送信中…; ステータスコード= +request.status}, onSuccess function(request){$( success ).innerHTML= 成功; ステータスコード= +request.status}, parameters Form.serialize(this)}); return false;" h3 Ajax呼び出しの内部状態を表示します /h3 div id="loading" style="font-size 1.2em" /div div id="loaded" style="font-size 1.2em" /div div id="inter" style="font-size 1.2em" /div div id="success" style="font-size 1.2em; color green" /div div id="failure" style="font-size 1.2em; color red" /div div id="complete" style="font-size 1.2em; color green" /div p input name="commit" type="submit" value="送信" / /p /form 内部では、prototype.jsのクラスが使用されているようです。 しかも変換されているのは、「Ajax.Request」ではなく「Ajax.Updater」のようです。ほとんど似た処理ですが、サーバ上のデータをページに非同期に挿入するのに使います。 非同期の持ち味を実感するには、クライアントサイドで「onSubmit」とか「onClick」とかでは、実感が薄いですね。 トリガーとなるイベントの種類や指定方法も整理しておくといいでしょう。 その前に、 successと completeの違いについて整理しておきます。上記のソースの実行結果は、実は問題があります。 successと completeの違いについて どちらもサーバからレスポンスが返される準備が整った状態ではありますが、ステータスでいうと、まず successになり、次に completeになります。これを同じ意味と捕らえるのはもったいないことです。実際に updateで指定された要素に結果が挿入されるのは、 completeのタイミングですが、そもそも非同期処理のため、ページが遷移せず、つまりは既読のデータ(id=completeで指定された領域のデータ)は消えないのです。そのため、前回サーバより取得した値は消えずに残り、そこに追記という形で対象要素にロードされるため、意図した結果にならないでしょう。その場合に、 successのステータスにおいて対象要素の「過去の値」を消す処理を施すことができます。 %= form_remote_tag ( update = "complete", url = { action = zero_update }, position = "top", success = "$( complete ).innerHTML= ;$( success ).innerHTML= 成功; ステータスコード= +request.status", loading = "$( loading ).innerHTML= リクエスト送信中…; ステータスコード= +request.status", loaded = "$( loaded ).innerHTML= リクエスト送信完了; ステータスコード= +request.status", interactive = "$( inter ).innerHTML= レスポンス受信中; ステータスコード= +request.status", failure = "$( failure ).innerHTML= エラー; ステータスコード= +request.status") % h3 Ajax呼び出しの内部状態を表示します /h3 div id="loading" style="font-size 1.2em" /div div id="loaded" style="font-size 1.2em" /div div id="inter" style="font-size 1.2em" /div div id="success" style="font-size 1.2em; color green" /div div id="failure" style="font-size 1.2em; color red" /div div id="complete" style="font-size 1.2em; color green" /div p %= submit_tag 送信 % /p %= end_form_tag % 遷移させないということは a RailsでのAjax利用の構造 a 自作のJavaScriptはどこに書くのか? link サーバ内テンプレートを元にコンボボックス表示 a リクエストの判別方法 a DBの値を元にコンボボックス表示 a 定期的なリクエスト実行 定期的な実行を伴うAjaxの処理は、「PeriodicalExecuter」を使用しますが、Railsではこれをさらにラップして「periodically_call_remote」というメソッドを使用します。 ここでは、サンプルとして、クライアント側から非同期に、ブラウザを利用しているユーザからは意識させずに、サーバーにアクセスし、サーバ上にあるDBの最新情報を取得して、それを画面を遷移させることなく表示するサンプルを作成してみます。 対象の画面:index3 イベント:タイマー 定期実行時間:3秒 リクエスト先のコントローラ:greeting リクエスト先のアクション:select_todos_by_mysql レスポンス先のエレメントID:complete とすると、 1、Viewは(greeting/index3.html.erb) hr/ %=periodically_call_remote( update = "complete", frequency = 3, url = { action = select_todos_by_mysql}, position = "top", success = "$( complete ).innerHTML = ", loading = "", loaded = "", interactive = "", failure = "") % div id="success" style="font-size 1.0em; color green" /div div id="complete" style="font-size 1.0em; color green" /div 2、コントローラは(greeting_controller.rb) def select_todos_by_mysql if request.xml_http_request?() @stmt = @con.createStatement rs = @stmt.executeQuery("select * from todos") str = while rs.next str += rs.getString(3) str += " br / " end puts str render text = str end end になります。(ここでDB接続と切断は他のアクションでも共通処理になるはずなので外だしすることにします。※後述します。)ここで、request.xml_http_request?()は非同期でリクエストされた時のみ処理するための記述です。 機能の内容をみてみましょう。 periodically_call_remoteメソッド update = レスポンス先のエレメントID指定, frequency = 秒数, url = { action = アクション名( メソッド名)}, position = 挿入場所, success = レスポンス完了前の直前処理, 変換後のHTMLは script type="text/javascript" // ![CDATA[ new PeriodicalExecuter(function() {new Ajax.Updater( complete , /greeting/select_todos_by_mysql , {asynchronous true, evalScripts true, insertion Insertion.Top, onFailure function(request){}, onInteractive function(request){}, onLoaded function(request){}, onLoading function(request){}, onSuccess function(request){$( complete ).innerHTML = }, parameters authenticity_token= + encodeURIComponent( e4a2e3f8ab38073ed2a9d8acaced418f8042a651 )})}, 3) //]] /script div id="success" style="font-size 1.0em; color green" /div div id="complete" style="font-size 1.0em; color green" /div これだけの記述で、タイマーによる非同期処理が実現できます。 なお、DBアクセスの部分は、今回「ActiveRecordを使わないやりかた」として、通常の「DriverManagerによる接続」を実装してみました。しかし、これはJrubyOnRailsによるJDBC接続となるため、ここでのトピックとしてのテーマとずれますが、実現方法はいたって簡単です。使用するDBのJDBCドライバを使用するRubyのlibフォルダに格納し使います。 DB接続と切断をアクション共通処理としてくくりだしたいので、 DB接続(共通処理:除外するアクションも指定可能) アクション:DB操作 DB切断(共通処理:除外するアクションも指定可能) こういう処理の流れが太枠になります。この構成をRailsで行うには、事前処理と事後処理ということで、 # DB接続部分は外だしし、メソッドの前に実行させる。 before_filter db_connect, except = [ index, index2, index3, index4] # DB切断は外だしし、メソッドの前に実行させる。 after_filter db_close, except = [ index, index2, index3, index4] を定義し、 private def db_connect begin java.lang.Class.forName( com.mysql.jdbc.Driver ).newInstance @con = java.sql.DriverManager.getConnection( jdbc mysql //localhost/JRoR2MySQLTom01_development , root , ); # rescue = ex # @message = error occureed !!! # ensure # @con.close if @con end end def db_close @con.close if @con end を実装します。この処理は「除外指定されていないメソッド」である「select_todos_by_mysql」の前後に差し込まれて実行されるため、DBの接続切断処理が自動的に行われる結果となります。 リクエスト情報 a
https://w.atwiki.jp/nikapoka/pages/13.html
Ruby on Railsのプラグインの情報 ログイン(ユーザ管理)プラグイン まとめサイト http //www13.atwiki.jp/maimuzo/pages/43.html#id_90d72bbe restful-authenticationを入れてみる windows環境の場合、gitをインストールする必要がある。 http //d.hatena.ne.jp/kusakari/20080715/1216091060 を参考にインストールする。 restful-authenticationのインストールの説明 http //blog.imishin.com/2008/09/14/rails-with-restful-authentication-on/ http //d.hatena.ne.jp/kusakari/20080825/1219667742
https://w.atwiki.jp/eyes_33/pages/15.html
というわけで、Railsも3になったんで、そろそろ勉強するかと、「Ruby on Rails 3 アプリケーションプログラミング」を買ってきて始めてみた。 いや、結構、これいいよ。みんな買うといい! で、以下は、その本で書いてあることをやった時のメモね。 環境 これは自分の環境ね。本とはちょっと違うので、ご注意を Ruby1.9.2:これ、結構重要。1.9.2からエンコードが強制に変わってるし。 むー、ruby1.9からは、ファイルのエンコーディングを「絶対に」指定しないとNGになるらしい。 なので、ファイルの頭に「# encoding utf-8」の記述が必須。微妙! Rails3.1.0:ここも、2からだいぶ変わったらしい。 実行環境は、WindowsXP Pro SP3 以下、やってみた時のメモね! 導入と基本 Railsの基本 モデルとかDBとか DBの値取得や表示、共通定数定義とか Scaffolding(スキャフィールディング) Scaffoldingで使われるテンプレートのコピーは、以下のコマンドで!(なんだけど、できんかったw P288参照)→エラーは出てもコピーはできるっぽい rake rails templates copy Scaffoldは便利だけど、日本語化を考えると固定でのカラム名とか出ちゃって微妙なんで、Scaffoldingの日本語化とかにいろいろ書いてみたよ! データベースの準備 開発編 ビューの開発ビュー側(erb)では、以下のビューヘルパーをどう使うかが重要。 form関連のビューヘルパー その他のビューヘルパー ビューヘルパーの自作 レイアウトと部分テンプレートで、共通レイアウトとか部分テンプレートを作るのねー モデルの開発モデル(と言っても、基本はActiveRecordの話ね)は、こんな感じでイケルのか? モデルの参照系 モデルの更新系 モデルのバリデート アソシエーション:これで、複数テーブルの処理が簡単に! コールバック マイグレーション コントローラの開発要するに、Railsではコントローラって、リクエスト/レスポンスを処理するところなんだねー リクエスト レスポンス HTML以外のレスポンス セッション/クッキーなど フィルタ(Basic認証&フォーム認証あり) Applicationの共通コントローラ ログ出力 書き方は、こんな感じ logger.debug( デバッグログを出すぜ! ) logger.debug( ハッシュだとこんな感じ? + hash.inspect ) レベル変更は、コンフィグファイル(config/environments/development.rbなど)で、以下を指定 config.log_level = debug 設定ファイル「config/application.rb」で以下を設定すると、リクエストのログ上などで[FILTERED]になるらしい config.filter_parameters += [ password] ログフィルタは、正規表現とかも使える 開発ツール Eclipseベースの「Aptana Studio」がお勧めみたいだけど…。使ってないから知らんw この辺を参考に、そのうち入れてみるか…(http //freesoftdownload.1-yo.com/webmake/aptana-studio.html) 結構いいよ、Aptana!ただ、更新したら動かなくなっちまった...。とりあえず、以下のコマンドでclean起動したら動いた? cd "C \Program Files\Aptana\Aptana Studio 3" "C \Program Files\Aptana\Aptana Studio 3\AptanaStudio3.exe" -clean 解説編 ルーティング Railsの基本は、RESTful! テスト メール送信 キャッシュ機能 国際化対応 Scaffoldingの日本語化とかでやったけど、i18n_generators を使えばモデルの日本語翻訳が一発だ!すげー! Ajax開発 Railsのプラグイン Apache+Passenger 自分でもいろいろやってみた! Ruby on Rails 3 アプリケーションプログラミングの中には無いけど、いろいろやってみた時のメモも一緒に書いておこうかな Scaffold系 カラム名に、「class」とかは使えないので注意! Scaffoldingの日本語化とか モデル系 scopeでallでの全件取得時にソートを指定するには、こんな感じで scope all, order( project_no ) default_scopeでやっちゃうと、「必ず」指定されちゃうんだなー。デフォルトの解除ってできないのかな? アソシエーションのbelongs_to時にクラス名を指定するには、こんな感じ belongs_to owner_member, class_name = "Member" これだと、Memberクラスにowner_member_idで関連づけになる なんで、上記をListクラスに書くと、View側でnameを取るにはこんな感じ % @lists.each do |list| % %= list.owner_member.name % % end % devise うーん、deviseの2になったら、confirmが動かなくなっちまったよー。 でも、app/views/devise/mailer/confirmation_instructions.html.erbのlink_toをこうすれば一応、動いた。 %= link_to regist , user_confirmation_url( confirmation_token = @resource.confirmation_token) % 要するに、この場合はモデルuser用にurlが生成されてるっぽいのと、前にあった第一パラメータの@resourceが無くなったことかな? ただ、変なのは、文字数が多い?と、メールのContent-Transfer-Encodingが変わっちゃって、URLがおかしくなるのはまいった…。 あー、そっか。URLとかがおかしくなるのは、HTMLだからなんだ!なんで、 ここ みたいに、ファイル名を*.text.erbにすれば… →あれ、駄目だw。deviseの元のHTMLファイルが使われちゃうなー。もちょっと調査要! 管理用にtypusを入れてみよう! がーん、Rails4だとだめっぽい まずは、Gemfileに以下の記述を追加 gem typus で、インストール&生成 bundle install rails generate typus 後は、普通にWebサーバを起動すれば...。 おー、http //localhost 3000/admin にアクセスすれば、管理画面として使えるね! 各テーブルが一覧で表示されて、クリックすれば全レコード表示になる、と。 で、各レコードの下に「Edit / Trash 」ってあるから、そこで変更&削除ができて、「Add New」で登録ね。 あー、ただ、IDの表示/入力はできないのかー。その辺は設定とかでなんとかなるのかな? とはいえ、簡単にメンテするだけなら、これで十分だね! あ、そのままだと管理画面が「認証なし」になっちゃうのかw ということで、Typusによる管理画面の実装を元にmigrateすれば、いいみたい rails generate typus migration rake db migrate これで、admin_usersってテーブルに管理用のユーザ情報を登録する形にできるんだね。簡単! ただ、管理者一人もいないと自動で初期管理者を登録する画面に遷移するから、スグ登録しないとまずいよ! モデルを作り直したら、typusでエラーが出るようになっちゃった。そりゃそうか。ということで、再構築するにはこんな感じ。 以下のファイルを削除 app/controllers/admin/* config/initializers/typus_* config/typus/* で、再構築 rails generate typus rails destroy typusじゃだめだったんだよなー。なんでだろ? Asset Pipelineって何じゃ? Rails3.1から入った機能で、要するにJavaScriptやCSSを圧縮して、リクエストの負荷を減らす仕組みっぽい。 ここが詳しくて、判りやすいな Asset Pipelineを理解する:http //ja.asciicasts.com/episodes/279-understanding-the-asset-pipeline Railsでネストしたモデルのformを使う fields_for, accepts_nested_attributes_for http //blog.livedoor.jp/satoyansoft/archives/65237464.html 要するに、Memberに複数のAddressが紐づいているときに、すごい便利! やり方は、こんな感じ Memberモデルに、accepts_nested_attributes_for で定義 accepts_nested_attributes_for address, allow_destroy = true で、Viewにこんな感じで書くとOK % form_for @member do |f| % email %= f.text_field email % br/ % f.fields_for address do |f2| % 都道府県 %= f2.text_fieldf prefecture % % end % % end % これ書くと、MemberのDestroy時に自動でAddressも削除されるし、すげーな! ただ、これ使うとFunctional Testで「No route matches」だ出ちゃって、動かんなー。 おや?これで、Memberのコントローラテストはイケルな?(http //stackoverflow.com/questions/11366981/functional-testing-wont-work-with-nested-params) get index, member_id = メンバーのID post new, member_id = メンバーのID, address = {アドレスの各項目} モデルでリクエストの内容を参照したい! なんかいつも忘れてしまうのでメモ モデル側(例:list.rb) attr_accessor request コントローラ側(例:lists_controller.rb) @list.request = request jQuery-UIのdatepicckerを使ってみよう! まあ、結局、これでオッケーだった。 Rails3.2でjQuery UIのdatepickerを使うときのあれこれまとめ jQuery]jQuery UI datepickerのメモ んだけど、とにかく画像の置き場でトラぶった…。 Herokuだと[assets/images/jquery-ui/images]に画像を置いたら、jquery-uiが無視された?Assetのせいかな? 仕方がないから、今回は全部[images/images]に画像を置いたら動いたけど…、本当はどーすりゃいいんだろ? RSpecで楽しいテストをやってみよう! まずは設定など Gemファイルにこれを追加 group test do gem "rspec" gem "rspec-rails" end bundle installを実行 $ rails g rspec install create .rspec create spec create spec/spec_helper.rb で、テストファイルを作成 $ rails g rspec model list create spec/models/list_spec.rb ※コントローラーはこんな感じで(複数形に注意!) $ rails g rspec controller lists create spec/controllers/lists_controller_spec.rb お次ぎはテストの書き方とか この場合は、Listクラスのallメソッドの正常系で、allがnilじゃないことを確認してるね require spec_helper describe List do describe all do context normal case do it not null do List.all.should_not be_nil end end end end この「should ==」ってば、「should eql()」とも書けるらしいけど、うーん、微妙。。。 まあ、細かいメソッドに関してはちょっと古いけど、RSpecの標準Matcher一覧表とか本家を見て確認ですな。 fixturesもあるんだね。よかったー まずは、fixturesファイルを以下に配置して $RAILS_APP/spec/fixtures/モデル名の複数形.yml こんな感じで中身を書いておいて、 list1 id 1 要素名 内容 list2 id 2 要素名 内容 後は、テスト時にこんな感じで呼び出すと、 fixtures フィクスチャファイルの名前のシンボル もしくは fixtures all テストの中でこんな感じで使えるよー。 lists( list1) ER図を作ろう へー、こんなんでER図が生成できるんだね。すごい! Rails - ER図を作成するアプリケーション erd 他の参考サイト Rails3のパッケージ管理ツール、Bundlerについて調べた Ruby on Rails 3.0 日記 ここだと、インストールからテンプレート作成、モデル&コントローラ作成から、アプリ開発までの開設あり! しかも、パッケージとしてページング(will_paginate)やユーザ認証(devise)の使い方や、ユーザ認証の日本語化なんかもあって、いいかも! Ruby on Railsの管理者画面を生成する「Typus」 rails 管理画面を簡単に作ってくれるtypusをやってみた:お、DB認証とかもあるっぽい typusのフォームでファイル参照とコンボボックス WindowsでRuby on Railsの開発環境を作るメモ ruby/rails/RailsGuidesをゆっくり和訳してみたよ/Active Record Associations ここは素晴らしいレベルで、見やすい! devise でメールアドレス以外を認証に使う macを買って、今すぐherokuでruby1.9.3 + rails3.2しよう! Redmine が ruby 1.9 に未対応なので ChiliProject を Heroku で試してみよう Devise を導入して Facebook 認証との統合をやってみる 大事なこととして、assets のコンパイルが自動でなくなるので、デプロイ時には「rake assets precompile」 を実行する。 でも、Herokuだと自動で実行されてるっぽいな。 Rails3の全体的な例外ハンドル coffee scriptのお勉強 つうか、普通にドットインストールがすばらしくてびっくりした! Railsの自動テスト(RSpecでModelのテスト編) deviseを使ったコントローラのテスト -